/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sd_proj1.mainProgram;

import genclass.FileOp;
import genclass.GenericIO;
import java.util.TreeMap;
import sd_proj1.monSolution.*;

/**
 *
 * @author Pedro Costa Correia - 32795
 * @author Valter Pedro Lopes Vicente - 39360
 */
public class Handicraft {

	/**
	 * @param args the command line arguments
	 */
	public static void main(String[] args) {
		StoreMonitor loja;                                    // loja
		WorkshopMonitor oficina;		 // oficina
		GeneralState estGlobal;				// global
		TreeMap map = new TreeMap();
		Message mlog = new Message();
		int nArtesaos = 3;                                     // número máximo de barbeiros
		int nDona = 1;
		int nClientes = 3;                                   // número de clientes
		int nPecas = 30;
		int nAlert = 10;
		int nPM = 20;

		for (int i = 0; i < nArtesaos; i++) {

			mlog.setstatCustomer(Message.customerStat.CODC, 0, i);
			mlog.setstatCraftsman(Message.craftsmanStat.FTPM, 0, i);

		}

		mlog.setOwnerStat(Message.ownerStat.OPTS);
		mlog.setShopDoorStat(Message.storeStat.SPCL);
		mlog.setShopStat(0, nPecas, 'F', 'F');
		mlog.setWorkShopStat(nPM, 0, 0, 0, 0);

		map.put(Clock.getInstance().getValue(), mlog);

		Craftsman[] artesao = new Craftsman[nArtesaos];             // array de threads barbeiro
		Customer[] cliente = new Customer[nClientes];         // array de threads cliente
		String fName = "log.txt";                                        // nome do ficheiro de logging
		boolean success;                                     // validação de dados de entrada
		char opt;                                            // opção

		/* inicialização */

		GenericIO.writelnString("\n" + "      Problema dos Artesanato de Aveiro\n");
		do {

			do {
				GenericIO.writeString("Nome do ficheiro de armazenamento da simulação? ");
				fName = GenericIO.readlnString();
			} while (fName == null);

			if (FileOp.exists(".", fName)) {
				do {
					GenericIO.writeString("Já existe um directório/ficheiro com esse nome. Quer apagá-lo (s - sim; n - não)? ");
					opt = GenericIO.readlnChar();
				} while ((opt != 's') && (opt != 'n'));
				if (opt == 's') {
					success = true;
				} else {
					success = false;
				}
			} else {
				success = true;
			}
		} while (!success);

		Log log = new Log(fName, map);
		estGlobal = new GeneralState(map);
		oficina = new WorkshopMonitor(nArtesaos, nPM, nAlert, estGlobal, map);
		loja = new StoreMonitor(nClientes, nPecas, estGlobal, map);
		Owner donaloja = new Owner(loja, oficina, estGlobal);


		for (int i = 0; i < nArtesaos; i++) {
			artesao[i] = new Craftsman(i, oficina, estGlobal);
		}
		for (int i = 0; i < nClientes; i++) {
			cliente[i] = new Customer(i, loja, estGlobal);
		}
		for (int i = 0; i < nClientes; i++) {
			cliente[i].start();
		}

		/* arranque da simulação */
		donaloja.start();
		for (int i = 0; i < nArtesaos; i++) {
			artesao[i].start();
		}



		/* aguardar o fim da simulação */

		GenericIO.writelnString();
		for (int i = 0; i < nClientes; i++) {
			try {
				cliente[i].join();
			} catch (InterruptedException e) {
			}
			GenericIO.writelnString("O cliente " + i + " terminou.");
		}
		GenericIO.writelnString();
		for (int i = 0; i < nArtesaos; i++) {
			try {
				artesao[i].join();
			} catch (InterruptedException e) {
			}
			GenericIO.writelnString("O artesao " + i + " terminou.");
		}
		GenericIO.writelnString();
		try {
			donaloja.join();
		} catch (InterruptedException e) {
		}
		GenericIO.writelnString("A dona terminou.");

		log.reportFinalStatus();
	}
}

